home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1994 March / Internet Info CD-ROM (Walnut Creek) (March 1994).iso / networking / ip / ka9q / aztecnos.arc / ARPCMD.C < prev    next >
Encoding:
C/C++ Source or Header  |  1988-12-18  |  4.1 KB  |  189 lines

  1. #include <stdio.h>
  2. #include "global.h"
  3. #include "mbuf.h"
  4. #include "timer.h"
  5. #include "enet.h"
  6. #include "ax25.h"
  7. #include "arp.h"
  8. #include "cmdparse.h"
  9.  
  10. extern char Badhost[];
  11. extern char Nospace[];
  12. extern struct arp_stat Arp_stat;
  13. extern char *Arptypes[];
  14. int32 resolve();
  15. void arp_drop();
  16. char *inet_ntoa();
  17. static int doarpadd(),doarpdrop();
  18. static void dumparp();
  19.  
  20. struct cmds Arpcmds[] = {
  21.     "add", doarpadd, 0, 4,
  22.     "arp add <hostid> ether|ax25|netrom <ether addr|callsign>",
  23.  
  24.     "drop", doarpdrop, 0, 3,
  25.     "arp drop <hostid> ether|ax25|netrom",
  26.  
  27.     "publish", doarpadd, 0, 4,
  28.     "arp publish <hostid> ether|ax25|netrom <ether addr|callsign>",
  29.  
  30.     NULLCHAR, NULLFP, 0, 0,
  31.     "arp subcommands: add, drop, publish",
  32. };
  33. char *Arptypes[] = {
  34.     "NET/ROM",
  35.     "10 Mb Ethernet",
  36.     "3 Mb Ethernet",
  37.     "AX.25",
  38.     "Pronet",
  39.     "Chaos",
  40.     "Arcnet",
  41.     "Appletalk"
  42. };
  43.  
  44. int
  45. doarp(argc,argv)
  46. int argc;
  47. char *argv[];
  48. {
  49.     if(argc < 2){
  50.         dumparp();
  51.         return 0;
  52.     }
  53.     return subcmd(Arpcmds,argc,argv);
  54. }
  55. static
  56. doarpadd(argc,argv)
  57. int argc;
  58. char *argv[];
  59. {
  60.     int16 hardware;
  61.     int32 addr;
  62.     char *hwaddr;
  63.     struct arp_tab *ap;
  64.     struct arp_type *at;
  65.     int pub = 0;
  66.  
  67.     if(argv[0][0] == 'p')    /* Is this entry published? */
  68.         pub = 1;
  69.     if((addr = resolve(argv[1])) == 0){
  70.         printf(Badhost,argv[1]);
  71.         return 1;
  72.     }
  73.     /* This is a kludge. It really ought to be table driven */
  74.     switch(tolower(argv[2][0])){
  75.     case 'n':    /* Net/Rom pseudo-type */
  76.         hardware = ARP_NETROM;
  77.         break;
  78.     case 'e':    /* "ether" */
  79.         hardware = ARP_ETHER;
  80.         break;        
  81.     case 'a':    /* "ax25" */
  82.         hardware = ARP_AX25;
  83.         break;
  84.     case 'm':    /* "mac appletalk" */
  85.         hardware = ARP_APPLETALK;
  86.         break;
  87.     default:
  88.         printf("unknown hardware type \"%s\"\n",argv[2]);
  89.         return -1;
  90.     }
  91.     /* If an entry already exists, clear it */
  92.     if((ap = arp_lookup(hardware,addr)) != NULLARP)
  93.         arp_drop(ap);
  94.  
  95.     at = &Arp_type[hardware];
  96.     if(at->scan == NULLFP){
  97.         printf("Attach device first\n");
  98.         return 1;
  99.     }
  100.     /* Allocate buffer for hardware address and fill with remaining args */
  101.     if((hwaddr = malloc(at->hwalen)) == NULLCHAR){
  102.         printf(Nospace);
  103.         return 0;
  104.     }
  105.     /* Destination address */
  106.     (*at->scan)(hwaddr,&argv[3],1);
  107.     ap = arp_add(addr,hardware,hwaddr,at->hwalen,pub);    /* Put in table */
  108.     free(hwaddr);                    /* Clean up */
  109.     stop_timer(&ap->timer);            /* Make entry permanent */
  110.     ap->timer.count = ap->timer.start = 0;
  111.     return 0;
  112. }
  113. /* Remove an ARP entry */
  114. static
  115. doarpdrop(argc,argv)
  116. int argc;
  117. char *argv[];
  118. {
  119.     int16 hardware;
  120.     int32 addr;
  121.     struct arp_tab *ap;
  122.  
  123.     if((addr = resolve(argv[1])) == 0){
  124.         printf(Badhost,argv[1]);
  125.         return 1;
  126.     }
  127.     /* This is a kludge. It really ought to be table driven */
  128.     switch(tolower(argv[2][0])){
  129.     case 'n':
  130.         hardware = ARP_NETROM;
  131.         break;
  132.     case 'e':    /* "ether" */
  133.         hardware = ARP_ETHER;
  134.         break;        
  135.     case 'a':    /* "ax25" */
  136.         hardware = ARP_AX25;
  137.         break;
  138.     case 'm':    /* "mac appletalk" */
  139.         hardware = ARP_APPLETALK;
  140.         break;
  141.     default:
  142.         hardware = 0;
  143.         break;
  144.     }
  145.     if((ap = arp_lookup(hardware,addr)) == NULLARP)
  146.         return -1;
  147.     arp_drop(ap);
  148.     return 0;    
  149. }
  150. /* Dump ARP table */
  151. static void
  152. dumparp()
  153. {
  154.     register int i;
  155.     register struct arp_tab *ap;
  156.     char e[128];
  157.  
  158.     printf("received %u badtype %u bogus addr %u reqst in %u replies %u reqst out %u\n",
  159.      Arp_stat.recv,Arp_stat.badtype,Arp_stat.badaddr,Arp_stat.inreq,
  160.      Arp_stat.replies,Arp_stat.outreq);
  161.  
  162.     printf("IP addr         Type           Time Q Addr\n");
  163.     for(i=0;i<ARPSIZE;i++){
  164.         for(ap = Arp_tab[i];ap != (struct arp_tab *)NULL;ap = ap->next){
  165.             printf("%-16s",inet_ntoa(ap->ip_addr));
  166.             printf("%-15s",Arptypes[ap->hardware]);
  167.             printf("%-5ld",read_timer(&ap->timer)*(long)MSPTICK/1000);
  168.             if(ap->state == ARP_PENDING)
  169.                 printf("%-2u",len_q(ap->pending));
  170.             else
  171.                 printf("  ");
  172.             if(ap->state == ARP_VALID){
  173.                 if(Arp_type[ap->hardware].format != NULLFP){
  174.                     (*Arp_type[ap->hardware].format)(e,ap->hw_addr);
  175.                 } else {
  176.                     e[0] = '\0';
  177.                 }
  178.                 printf("%s",e);
  179.             } else {
  180.                 printf("[unknown]");
  181.             }
  182.             if(ap->pub)
  183.                 printf(" (published)");
  184.             printf("\n");
  185.         }
  186.     }
  187.     return;
  188. }
  189.